home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 1 / Gold Medal Software Volume 1 (Gold Medal) (1994).iso / graphics / tierra40.arj / BEAGLE / BFRAGMEN.C < prev    next >
C/C++ Source or Header  |  1992-09-11  |  7KB  |  232 lines

  1. /* fragment.c  27-3-92  makes fragment of tierra.run */
  2. /*** Beagle Explorer: Version 3.1  Copyright (c) 1990, 1991, 1992  Tom Ray ***/
  3.  
  4. #include "beagle.h"
  5. #include "externb.h"
  6.  
  7. extern int   genotypes;
  8. extern char  directory[];
  9.  
  10. void OutFragTree(struct tnode  *t, FILE  *ouf);
  11. void CountTTree(struct tnode  *t, int  *num);
  12.  
  13. int fragment(void)
  14. {   int  i, start, stop;
  15.     char  infile[13], oufile[13];
  16.     static int  first = 1;
  17.     HWND         whgt, whins;
  18.     TRANSACTION  *ptgt;
  19.  
  20.     if(first)
  21.     {   first = 0; start = 0; stop = 1;
  22.         sprintf(infile,"break.1"); sprintf(oufile,"fragment.run");
  23.         sprintf(directory,"c:\\tierra\\td");
  24.         wind_setup();
  25.     }
  26.     while(1) {
  27.     whgt = wigen(2,4,5,56,FRDOUBLE,"fragment");
  28.     ptgt = vpreload(5,0,NULLF,NULLF,NULLF,NULLF);
  29.     for(i = 0; i <= 4; i++) (*(ptgt->def))[i].use_ext = TRUE;
  30.     vdeffld(ptgt,0,STRING,0,1, "directory   =",-1,40,NULL,directory,NO);
  31.     vdeffld(ptgt,1,STRING,1,1, "input file  =",-1,12,NULL,infile,NO);
  32.     vdeffld(ptgt,2,STRING,2,1, "output file =",-1,12,NULL,oufile,NO);
  33.     vdeffld(ptgt,3,INTEGER,3,1,"start time  =",-1,5,NULL,&start,NO);
  34.     vdeffld(ptgt,4,INTEGER,4,1,"stop time   =",-1,5,NULL,&stop,NO);
  35.     ptgt->fld_valfn = temp_info_chk_f;
  36.     whins = wiinv(23,13,
  37.         "\x1e\x1f, or Enter to select; Esc to exit; Ctrl-Enter to run");
  38.     visible(whgt,YES,YES);
  39.     if(DWSUCCESS == vread(ptgt,whgt,YES))
  40.     {   vdelete(whgt,NONE); vdelete(whins,NONE);
  41.         fragmen(infile,oufile,directory,start,stop);
  42.     }
  43.     else
  44.     {   vdelete(whgt,NONE); vdelete(whins,NONE);
  45.         return 1;
  46.     }
  47.     }
  48.     vdelete(whins,NONE);
  49.     return 1;
  50. }
  51.  
  52. int temp_info_chk_f(TRANSACTION  *tp)
  53. {   FILE  *inf;
  54.     char  path[80], cpath[80];
  55.     int  success;
  56.  
  57.     if(tp->cur_fld == 0)
  58.     {   getcwd(cpath,79);
  59.         success = chdir((*(tp->def))[0].dataptr);
  60.         chdir(cpath);
  61.         if(success)
  62.         {   wierror(2,45,"directory not found");
  63.             return FALSE;
  64.         }
  65.         return TRUE;
  66.     }
  67.     if(tp->cur_fld == 1)
  68.     {   sprintf(path,"%s/%s", (*(tp->def))[0].dataptr,
  69.             (*(tp->def))[1].dataptr);
  70.         inf = fopen(path,"r");
  71.         if(inf == NULL)
  72.         {   wierror(2,45,"file not found");
  73.             return FALSE;
  74.         }
  75.         fclose(inf);
  76.     }
  77.     return TRUE;
  78. }
  79.  
  80. void fragmen(char  *infile, char  *oufile, char  *directory,
  81.     int  start, int  stop)
  82. {   int  first = 1, not_yet = 1, species = 0;
  83.     struct tnode  *troot = NULL;
  84.     struct last_out  lo;
  85.     long  time;
  86.     Ulong c = 0;
  87.     char  data[81], *obufr;
  88.     HWND  witi;
  89.     FILE  *inf, *ouf;
  90.     char   bifile[13];
  91.     int    binum = 1;
  92.  
  93.     sscanf(infile,"%[^.]", bifile);
  94.     sprintf(data,"%s/%s", directory, infile);
  95.     inf = fopen(data,"r");
  96.     if(inf == NULL)
  97.     {   wierror(2,45,"input file not found");
  98.         return ;
  99.     }
  100.     sprintf(data,"%s/%s", directory, oufile);
  101.     ouf = fopen(data,"w");
  102.     lo.ctime = lo.time = 0;
  103.     genotypes = 1;
  104.     obufr = (char  *) calloc(8192, sizeof(char));
  105.     if(obufr == NULL)
  106.     {   wierror(2,45,"calloc failure, exiting");
  107.         vexit(0);
  108.     }
  109.     setvbuf(ouf,obufr,_IOFBF,8192);
  110.     witi = wigen(7,33,1,15,FRDOUBLE,"time");
  111.     for(;;)
  112.     {   if(fgets(data,80,inf) == NULL)
  113.         {   fclose(inf);
  114.             binum++;
  115.             sprintf(data,"%s/%s.%d", directory, bifile, binum);
  116.             inf = fopen(data,"r");
  117.             if(inf == NULL)
  118.                 break ;
  119.             if(fgets(data,80,inf) == NULL)
  120.                 break ;
  121.         }
  122.         t_read(data, &lo, &first, &genotypes);
  123.         if(!(c%100LU))
  124.             vatputf(witi,0,1,"%5lu,%06lu", lo.ctime, lo.time);
  125.         c++;
  126.         if(lo.ctime < start) troot = AddTree(troot,&lo);
  127.         if(lo.ctime >= start && lo.ctime <= stop)
  128.         {   if(not_yet && start > 0)
  129.             {   not_yet = 0;
  130.                 CountTTree(troot,&species);
  131.                 fprintf(ouf,"num_sp = %d  ctime = %lu  time = %lu\n",
  132.                     species, lo.ctime, lo.time );
  133.                 OutFragTree(troot,ouf);
  134.                 sscanf(data,"%lx", &time);
  135.                 fprintf(ouf,"%lx %c %d", time, lo.bd, lo.size);
  136.                 if(genotypes) fprintf(ouf," %s", lo.label);
  137.                 fprintf(ouf,"\n");
  138.                 FreeTTree(troot);
  139.             }
  140.             else
  141.             fprintf(ouf,"%s",data);
  142.         }
  143.         if(lo.ctime > stop) break;
  144.     }
  145.     vdelete(witi,NONE);
  146.     fclose(inf);
  147.     fclose(ouf);
  148.     free(obufr);
  149. }
  150.  
  151. void CountTTree(struct tnode  *t, int  *num)
  152. {   int  i;
  153.  
  154.     if(t != NULL)
  155.     {   if(genotypes)
  156.         {   for(i = 0; i < t->gsize; i++)
  157.                 if((t->g + i)->end > 0)
  158.                     (*num)++;
  159.         }
  160.         else
  161.             if(t->sd.end > 0)
  162.                 (*num)++;
  163.         CountTTree(t->l,num);
  164.         CountTTree(t->r,num);
  165.     }
  166. }
  167.  
  168. void OutFragTree(struct tnode  *t, FILE  *ouf)
  169. {   int  i;
  170.     char  lbl[4];
  171.  
  172.     if(t != NULL)
  173.     {   if(genotypes) for(i = 0; i < t->gsize; i++)
  174.         {   if((t->g + i)->end <= 0)
  175.                 continue ;
  176.             Int2Lbl(i,lbl);
  177.             fprintf(ouf,"%04ld%s %ld\n", t->size, lbl, (t->g + i)->end);
  178.         }
  179.         else if(t->sd.end > 0)
  180.         {   strcpy(lbl,"---");
  181.             fprintf(ouf,"%04ld%s %ld\n", t->size, lbl, t->sd.end);
  182.         }
  183.         OutFragTree(t->r, ouf);
  184.         OutFragTree(t->l, ouf);
  185.     }
  186. }
  187.  
  188. /*
  189. struct rspecies * fix_array(struct rspecies  *sp, int *num_sp, int *array_siz,
  190.     struct last_out  *lo)
  191. {    int  i, in = 1, found;
  192.  
  193.     found = 0;
  194.     for(i = 1; i <= *num_sp; i++)
  195.     {   if(genotypes)
  196.         {   if(sp[i].size == lo->size && !strcmp(sp[i].label,lo->label))
  197.             { in = i; found = 1; break; }
  198.         }
  199.         else
  200.         {   if(sp[i].size == lo->size)
  201.             { in = i; found = 1; break; }
  202.         }
  203.     }
  204.     if(!found)
  205.     {   (*num_sp)++; in = *num_sp;
  206.         if(*num_sp >= *array_siz)
  207.         {   (*array_siz) += 50;
  208.             sp = (struct rspecies *)
  209.                 realloc(sp, *array_siz * sizeof(struct rspecies));
  210.             if(sp == NULL) vexit(0);
  211.             for(i = *array_siz - 50; i < *array_siz; i++)
  212.             {   sp[i].size = sp[i].num = sp[i].begin = sp[i].max =
  213.                     sp[i].min = 0;
  214.                 sprintf((sp + i)->label,"---");
  215.             }
  216.         }
  217.         sp[in].size = lo->size;
  218.         if(genotypes) sprintf(sp[in].label,lo->label);
  219.     }
  220.     count(sp, lo->bd);
  221.     count(sp + in, lo->bd);
  222.     return sp;
  223. }
  224.  
  225. void count(struct rspecies  *s, char  bd)
  226. {   if(bd == 'b') s->num++;
  227.     if(bd == 'd') s->num--;
  228.     if(s->num < s->min) s->min = s->num;
  229.     if(s->num > s->max) s->max = s->num;
  230. }
  231. */
  232.